--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tests/frontend/LinkUtils.test.js 67e78aa299d1bde9de61fcc4dc3e95a36eeb92d6 (67e78aa2) Text, 13.24 KB
Tff7b72import Tb4b4b4{ Te6edf3describeTb4b4b4, Te6edf3itTb4b4b4, Te6edf3expect Tb4b4b4} Tff7b72from Ta5d6ff"vitest"Tb4b4b4;
Tff7b72import Te6edf3LinkUtils Tff7b72from Ta5d6ff"@/js/LinkUtils"Tb4b4b4;
Te6edf3describeTb4b4b4(Ta5d6ff"LinkUtils.js"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3describeTb4b4b4(Ta5d6ff"renderReticulumLinks"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3itTb4b4b4(Ta5d6ff"detects nomadnet:// links with hash and path"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"nomadnet://1dfeb0d794963579bd21ac8f153c77a4:/page/index.mu"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'class="nomadnet-link'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'data-nomadnet-url="1dfeb0d794963579bd21ac8f153c77a4:/page/index.mu"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"detects nomadnet@ links"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"nomadnet@1dfeb0d794963579bd21ac8f153c77a4"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'class="nomadnet-link'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'data-nomadnet-url="1dfeb0d794963579bd21ac8f153c77a4:/page/index.mu"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"detects bare hash and path links as nomadnet"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"1dfeb0d794963579bd21ac8f153c77a4:/page/index.mu"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'class="nomadnet-link'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'data-nomadnet-url="1dfeb0d794963579bd21ac8f153c77a4:/page/index.mu"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"includes Nomad backtick field parameters in the link"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72=
Ta5d6ff"9ce92808be498e9e05590ff27cbfdfe4:/page/forum/thread.mu`cat=general|thread=critical-security-update-rns-139-fixes-severe-rnsh-security-flaw"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'class="nomadnet-link'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(
Ta5d6ff'data-nomadnet-url="9ce92808be498e9e05590ff27cbfdfe4:/page/forum/thread.mu`cat=general|thread=critical-security-update-rns-139-fixes-severe-rnsh-security-flaw"'
Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(
Ta5d6ff">9ce92808be498e9e05590ff27cbfdfe4:/page/forum/thread.mu`cat=general|thread=critical-security-update-rns-139-fixes-severe-rnsh-security-flaw</a>"
Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toMatchTb4b4b4(Ta5d6ff/thread\.mu<\/a>`cat=/Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"keeps Nomad field params when wrapped with nomadnet:// prefix"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"nomadnet://1dfeb0d794963579bd21ac8f153c77a4:/page/forum/thread.mu`cat=general|thread=slug"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(
Ta5d6ff'data-nomadnet-url="1dfeb0d794963579bd21ac8f153c77a4:/page/forum/thread.mu`cat=general|thread=slug"'
Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"trims trailing sentence punctuation after Nomad field params"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"see 1dfeb0d794963579bd21ac8f153c77a4:/page/forum/thread.mu`cat=general|thread=slug."Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(
Ta5d6ff'data-nomadnet-url="1dfeb0d794963579bd21ac8f153c77a4:/page/forum/thread.mu`cat=general|thread=slug"'
Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"</a>."Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"does not detect bare hash without prefix as lxmf"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"1dfeb0d794963579bd21ac8f153c77a4"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"lxmf-link"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<a "Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"does not false-detect hex in a github blob url as lxmf"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72=
Ta5d6ff"https://github.com/org/repo/blob/9a47f3fc51dd3318aec0d2eb9ab6fc497c0f1aef/electron-builder.yml#L29"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"lxmf-link"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"nomadnet-link"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"detects lxmf: links"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"lxmf:1dfeb0d794963579bd21ac8f153c77a4"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'class="lxmf-link'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'data-lxmf-address="1dfeb0d794963579bd21ac8f153c77a4"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"detects lxmf:// links"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"lxmf://1dfeb0d794963579bd21ac8f153c77a4"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'class="lxmf-link'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'data-lxmf-address="1dfeb0d794963579bd21ac8f153c77a4"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"detects lxmf@ links"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"lxmf@1dfeb0d794963579bd21ac8f153c77a4"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'class="lxmf-link'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'data-lxmf-address="1dfeb0d794963579bd21ac8f153c77a4"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3describeTb4b4b4(Ta5d6ff"renderStandardLinks"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3itTb4b4b4(Ta5d6ff"detects http links"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"visit http://example.com"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderStandardLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toMatchTb4b4b4(Ta5d6ff/<a href="http:\/\/example\.com\/?"/Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"detects https links"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"visit https://example.com/path?query=1"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderStandardLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'<a href="https://example.com/path?query=1"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"trims trailing punctuation from detected urls"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderStandardLinksTb4b4b4(Ta5d6ff"visit https://example.com/path?x=1, now"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'href="https://example.com/path?x=1"'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"</a>, now"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"keeps balanced parenthesis in url but trims unmatched trailing one"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3withBalanced Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderStandardLinksTb4b4b4(Ta5d6ff"see https://example.com/path_(v1)"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3withBalancedTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'href="https://example.com/path_(v1)"'Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3withTrailing Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderStandardLinksTb4b4b4(Ta5d6ff"see (https://example.com/path_(v1))"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3withTrailingTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'href="https://example.com/path_(v1)"'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3withTrailingTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"</a>)"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"keeps escaped entity query content in href"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"visit https://example.com/search?q=a&lang=en"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderStandardLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'href="https://example.com/search?q=a&lang=en"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3describeTb4b4b4(Ta5d6ff"renderAllLinks"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3itTb4b4b4(Ta5d6ff"detects both types of links"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"Check https://google.com and nomadnet://1dfeb0d794963579bd21ac8f153c77a4"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderAllLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toMatchTb4b4b4(Ta5d6ff/<a href="https:\/\/google\.com\/?"/Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'data-nomadnet-url="1dfeb0d794963579bd21ac8f153c77a4:/page/index.mu"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"returns empty string for empty input"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3LinkUtilsTb4b4b4.Te6edf3renderAllLinksTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"returns string with no links for plain text"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderAllLinksTb4b4b4(Ta5d6ff"Just some words."Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"Just some words."Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<a "Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"does not double-wrap urls inside existing anchors"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3original Tff7b72= Ta5d6ff'already linked <a href="https://example.com">https://example.com</a>'Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderAllLinksTb4b4b4(Te6edf3originalTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Te6edf3originalTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tb4b4b4(Te6edf3resultTb4b4b4.Te6edf3matchTb4b4b4(Ta5d6ff/<a /gTb4b4b4) Tff7b72|| Tb4b4b4[Tb4b4b4]Tb4b4b4)Tb4b4b4.Te6edf3lengthTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"keeps reticulum path underscores"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"1dfeb0d794963579bd21ac8f153c77a4:/page/meshchatx_on_pi.mu"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderAllLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'data-nomadnet-url="1dfeb0d794963579bd21ac8f153c77a4:/page/meshchatx_on_pi.mu"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"does not false-detect hex in a github blob url as lxmf or nomadnet"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72=
Ta5d6ff"https://github.com/org/repo/blob/9a47f3fc51dd3318aec0d2eb9ab6fc497c0f1aef/electron-builder.yml#L29"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderAllLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"lxmf-link"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"nomadnet-link"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(
Ta5d6ff'href="https://github.com/org/repo/blob/9a47f3fc51dd3318aec0d2eb9ab6fc497c0f1aef/electron-builder.yml#L29"'
Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"detects lxmf: prefixed address in plain text"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"send to lxmf:1dfeb0d794963579bd21ac8f153c77a4 please"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderAllLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'class="lxmf-link'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'data-lxmf-address="1dfeb0d794963579bd21ac8f153c77a4"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3describeTb4b4b4(Ta5d6ff"risky: no script or data URLs in href"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3itTb4b4b4(Ta5d6ff"does not produce javascript: href for text containing javascript: URL"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"see javascript:alert(1) here"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderStandardLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toMatchTb4b4b4(Ta5d6ff/\bhref\s*=\s*["']?\s*javascript:/iTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"does not produce data: href for text containing data: URL"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"see data:text/html,<script>x</script> here"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderStandardLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toMatchTb4b4b4(Ta5d6ff/\bhref\s*=\s*["']?\s*data\s*:/iTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"does not produce data: href for data image payload text"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"inline image data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderStandardLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toMatchTb4b4b4(Ta5d6ff/\bhref\s*=\s*["']?\s*data\s*:/iTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<a "Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"stops URL at space so no script in same line"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"https://example.com javascript:alert(1)"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderStandardLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toMatchTb4b4b4(Ta5d6ff/<a href="https:\/\/example\.com\/?"/Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toMatchTb4b4b4(Ta5d6ff/href="[^"]*javascript:/Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"does not put attacker text inside the anchor opening tag"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff'see https://evil.example/path" onmouseover="alert(1) ok'Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderStandardLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3open Tff7b72= Te6edf3resultTb4b4b4.Te6edf3indexOfTb4b4b4(Ta5d6ff"<a "Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3openEnd Tff7b72= Te6edf3resultTb4b4b4.Te6edf3indexOfTb4b4b4(Ta5d6ff">"Tb4b4b4, Te6edf3openTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3openTag Tff7b72= Te6edf3resultTb4b4b4.Te6edf3sliceTb4b4b4(Te6edf3openTb4b4b4, Te6edf3openEnd Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3openTagTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toMatchTb4b4b4(Ta5d6ff/onmouseover/iTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3openTagTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toMatchTb4b4b4(Ta5d6ff/javascript:/iTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"handles null and undefined without throwing"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Tff7b72nullTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Tff7b72undefinedTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3LinkUtilsTb4b4b4.Te6edf3renderStandardLinksTb4b4b4(Tff7b72nullTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"handles very long input without hanging"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Tff7b72long Tff7b72= Ta5d6ff"a"Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff100000Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3start Tff7b72= Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3LinkUtilsTb4b4b4.Te6edf3renderAllLinksTb4b4b4(Tff7b72longTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3startTb4b4b4)Tb4b4b4.Te6edf3toBeLessThanTb4b4b4(T79c0ff200Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3describeTb4b4b4(Ta5d6ff"httpUrlHrefOrNull"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3itTb4b4b4(Ta5d6ff"returns canonical https href"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3LinkUtilsTb4b4b4.Te6edf3httpUrlHrefOrNullTb4b4b4(Ta5d6ff"https://example.com/path"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff"https://example.com/path"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"returns null for javascript: payloads that start with https-looking junk"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3LinkUtilsTb4b4b4.Te6edf3httpUrlHrefOrNullTb4b4b4(Ta5d6ff"https://example.com javascript:alert(1)"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeNullTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"returns null for non-http schemes"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3LinkUtilsTb4b4b4.Te6edf3httpUrlHrefOrNullTb4b4b4(Ta5d6ff"javascript:alert(1)"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeNullTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3LinkUtilsTb4b4b4.Te6edf3httpUrlHrefOrNullTb4b4b4(Ta5d6ff"file:///etc/passwd"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeNullTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3describeTb4b4b4(Ta5d6ff"fuzzing robustness"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3itTb4b4b4(Ta5d6ff"httpUrlHrefOrNull and renderAllLinks tolerate random BMP strings"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< T79c0ff300Tb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72let Te6edf3s Tff7b72= Ta5d6ff""Tb4b4b4;
Tff7b72const Te6edf3len Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tffa657MathTb4b4b4.Te6edf3randomTb4b4b4(Tb4b4b4) Tff7b72* T79c0ff600Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3j Tff7b72= T79c0ff0Tb4b4b4; Te6edf3j Tff7b72< Te6edf3lenTb4b4b4; Te6edf3jTff7b72++Tb4b4b4) Tb4b4b4{
Te6edf3s Tff7b72+= Tffa657StringTb4b4b4.Te6edf3fromCharCodeTb4b4b4(Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tffa657MathTb4b4b4.Te6edf3randomTb4b4b4(Tb4b4b4) Tff7b72* T79c0ff65536Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3expectTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3LinkUtilsTb4b4b4.Te6edf3httpUrlHrefOrNullTb4b4b4(Te6edf3sTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toThrowTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3LinkUtilsTb4b4b4.Te6edf3renderAllLinksTb4b4b4(Te6edf3sTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toThrowTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3h Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3httpUrlHrefOrNullTb4b4b4(Te6edf3sTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3h Tff7b72!== Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3hTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"http://"Tb4b4b4) Tff7b72|| Te6edf3hTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"https://"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3rendered Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderAllLinksTb4b4b4(Te6edf3sTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3renderedTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<script"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────